import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import os
from matplotlib import rcParams
from wordcloud import WordCloud  # 导入词云库

# 设置中文字体
rcParams['font.sans-serif'] = ['Microsoft YaHei']  # 使用微软雅黑
rcParams['axes.unicode_minus'] = False  # 显示负号

def create_wordcloud(df, output_dir):
    # 将所有类型合并为一个字符串
    all_types = ' '.join(df['类型'].dropna())  # 去掉缺失值并合并为一个字符串

    # 创建词云（确保使用支持中文的字体）
    wordcloud = WordCloud(width=800, height=400, background_color='white',
                          font_path="C:\\Windows\\Fonts\\msyh.ttc").generate(all_types)  # 设置字体路径为微软雅黑

    # 绘制词云
    plt.figure(figsize=(10, 5))
    plt.imshow(wordcloud, interpolation='bilinear')
    plt.axis('off')  # 不显示坐标轴
    plt.title("电影类型词云图", fontsize=20)
    plt.savefig(os.path.join(output_dir, "电影类型词云图.png"))  # 保存词云图

def plot_data():
    input_path = "./data/cleaned_data.csv"
    df = pd.read_csv(input_path)

    # 创建目录，如果不存在
    output_dir = "./visualizations/images/"
    os.makedirs(output_dir, exist_ok=True)

    # 处理年份数据，创建一个新的列用于每五年分组
    df['年份'] = pd.to_numeric(df['年份'], errors='coerce')  # 确保年份为数值型
    df['年份段'] = (df['年份'] // 5) * 5  # 每五年为一个单位

    # 1. 评分分布
    plt.figure(figsize=(10, 6))
    sns.histplot(df["评分"], bins=20, kde=True, color="blue")
    plt.title("评分分布", fontsize=16)
    plt.xlabel("评分", fontsize=12)
    plt.ylabel("电影数量", fontsize=12)
    plt.savefig(os.path.join(output_dir, "评分分布.png"))

    # 2. 上映年份分布（每五年为一个单位）
    plt.figure(figsize=(10, 6))
    sns.countplot(x="年份段", data=df, palette="viridis", order=sorted(df["年份段"].unique()))
    plt.xticks(rotation=45)
    plt.title("上映年份分布（每五年）", fontsize=16)
    plt.xlabel("年份段", fontsize=12)
    plt.ylabel("电影数量", fontsize=12)
    plt.savefig(os.path.join(output_dir, "上映年份分布.png"))

    # 3. 按年份平均评分折线图（每五年为一个单位）
    plt.figure(figsize=(10, 6))
    avg_scores_by_year = df.groupby("年份段")["评分"].mean().reset_index()
    sns.lineplot(x="年份段", y="评分", data=avg_scores_by_year, marker="o")
    plt.title("按年份段平均评分", fontsize=16)
    plt.xlabel("上映年份段", fontsize=12)
    plt.ylabel("平均评分", fontsize=12)
    plt.savefig(os.path.join(output_dir, "按年份段平均评分.png"))

    # 4. 主演电影数量 Top 10
    plt.figure(figsize=(10, 6))
    df["主演"] = df["主演"].str.split(",")  # 假设主演以逗号分隔
    actors = pd.Series([actor.strip() for sublist in df["主演"].dropna() for actor in sublist])
    top_actors = actors.value_counts().head(10)
    sns.barplot(x=top_actors.values, y=top_actors.index, palette="magma")
    plt.title("主演电影数量 Top 10", fontsize=16)
    plt.xlabel("电影数量", fontsize=12)
    plt.ylabel("主演", fontsize=12)
    plt.savefig(os.path.join(output_dir, "主演Top10.png"))

    # 5. 不同年份的电影数量及评分分布
    plt.figure(figsize=(10, 6))
    sns.boxplot(x="年份", y="评分", data=df, palette="coolwarm")
    plt.xticks(rotation=45)
    plt.title("不同年份的电影评分分布", fontsize=16)
    plt.xlabel("年份", fontsize=12)
    plt.ylabel("评分", fontsize=12)
    plt.savefig(os.path.join(output_dir, "不同年份电影评分分布.png"))

    # 6. 主演与评分的关系（主演与评分的平均关系）
    plt.figure(figsize=(10, 6))
    top_actors_scores = df.explode("主演").groupby("主演")["评分"].mean().reset_index()
    top_actors_scores = top_actors_scores.sort_values(by="评分", ascending=False).head(10)
    sns.barplot(x="评分", y="主演", data=top_actors_scores, palette="magma")
    plt.title("主演与评分的关系", fontsize=16)
    plt.xlabel("平均评分", fontsize=12)
    plt.ylabel("主演", fontsize=12)
    plt.savefig(os.path.join(output_dir, "主演与评分的关系.png"))

    # 7. 评分与国别的关系（按国别分组的平均评分，只取前十个国别）
    plt.figure(figsize=(10, 6))
    country_counts = df['国别'].value_counts().head(10)  # 计算最多上榜的十个国别
    country_avg_score = df[df['国别'].isin(country_counts.index)].groupby("国别")["评分"].mean().reset_index()
    country_avg_score = country_avg_score.sort_values(by="评分", ascending=False)
    sns.barplot(x="评分", y="国别", data=country_avg_score, palette="YlGnBu")
    plt.title("不同国别电影的平均评分（前十国别）", fontsize=16)
    plt.xlabel("平均评分", fontsize=12)
    plt.ylabel("国别", fontsize=12)
    plt.savefig(os.path.join(output_dir, "不同国别电影的平均评分.png"))

    # 8. 创建类型的词云图
    create_wordcloud(df, output_dir)

    print("图表绘制完成，已保存到 ./visualizations/images/")

if __name__ == "__main__":
    plot_data()
